home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / EXCEPTS.NEW < prev    next >
Encoding:
Modula Definition  |  1990-11-04  |  3.8 KB  |  102 lines

  1. DEFINITION MODULE Excepts;
  2.  
  3. (*
  4.  * Low-Level Modul, mit dem Modula-Prozeduren ohne Assembler-Einsatz
  5.  * zum Abfangen jeder beliebigen Prozessor-Exception (TRAP-Instruktionen,
  6.  * Bus-Error, usw.) installiert werden können.
  7.  * Damit ist es beispielsweise ein Kinderspiel, die TRAP #2 - Aufrufe
  8.  * zu den GEM-Funktionen abzufangen, um dann eine eigene File-Selektor-
  9.  * Funktion statt der Normalen ausführen zu lassen.
  10.  *
  11.  * Ein kurzes Beispielprogramm ist
  12.  *
  13.  *   ExcDemo.M  im DEMO-Ordner
  14.  *)
  15.  
  16.  
  17. FROM SYSTEM IMPORT WORD, ADDRESS;
  18.  
  19. FROM MOSGlobals IMPORT MemArea;
  20.  
  21. FROM SysTypes IMPORT AnyLongType, PtrAnyType, ExcSet, Exceptions, BusError,
  22.                      AddrError, ExcDesc;
  23.  
  24.  
  25. TYPE PreExcProc = PROCEDURE (VAR ExcDesc): BOOLEAN;
  26.                       (* RETURN: FALSE: Return from Exc, TRUE: call others *)
  27.  
  28. PROCEDURE InstallPreExc (REF traps: ExcSet;
  29.                          call: PreExcProc; usermode: BOOLEAN;
  30.                          workSpace: MemArea; VAR hdl: ADDRESS);
  31.   (*
  32.    * Installiert eine Exception-Behandlungsroutine 'call' für die
  33.    * in 'traps' angegebenen Exceptions. Der Routine 'call' wird
  34.    * bei Eintritt einer der Exceptions ein Feld mit allen Systemregistern
  35.    * (ExcDesc) übergeben. Bei Rückkehr der Routine muß sie entweder FALSE
  36.    * liefern, wenn das durch den Fehler unterbrochene Programm weiterge-
  37.    * führt werden soll (ggf. muß 'regPC' hinter die fehlerauslösende Anwei-
  38.    * sung gesetzt werden) oder TRUE liefern, wenn evtl. vor dem 'InstallExc'
  39.    * Aufruf installierte Routinen zusätzlich ausgeführt werden sollen
  40.    * (dies ist z.B. bei Interrupt-Routinen und 'EtvTimer' sinnvoll).
  41.    *
  42.    * Ist 'usermode' TRUE, wird die Routine 'call' im User-Mode aufgerufen.
  43.    * Ist 'usermode' FALSE, wird sie im Supervisor-Mode aufgerufen (ist
  44.    * u.a. auch schneller!). Allerdingso darf dies nicht auf die Buserror-
  45.    * und Addresserror-Exceptions angewendet werden!
  46.    *
  47.    * Bei Mißerfolg (weil zu wenig freier Speicher) ist 'hdl' = NIL; ansonsten
  48.    * ist 'hdl' bei Freigabe der Exceptions mit 'DeInstallExc' wieder zu
  49.    * übergeben.
  50.    *
  51.    * 'call' erhält in 'ExcDesc.parms' den Zeiger auf die evtl. auf dem Stack
  52.    * übergebenen Daten.
  53.    *
  54.    * Vorsicht: Wenn mit dieser Funktion Interruptroutinen installiert werden,
  55.    * kann es passieren, daß schon vor Rückkehr aus dieser Funktion die
  56.    * Prozedur 'call' aufgerufen wird! Ggf. müssen vor diesem Aufruf die
  57.    * Interrupts gesperrt werden.
  58.    *
  59.    * Falls die aufzurufende Prozedur in Assembler programmiert wird,
  60.    * weisen wir darauf hin, daß es nötig ist, die Register D3-D7/A3-A6,
  61.    * wie bei jeder normalen Modula-Routine, zu retten!
  62.    *)
  63.  
  64.  
  65. TYPE PostExcProc = PROCEDURE (VAR ExcDesc);
  66.  
  67. PROCEDURE InstallPostExc (REF traps: ExcSet;
  68.                           call: PostExcProc; usermode: BOOLEAN;
  69.                           workSpace: MemArea; VAR hdl: ADDRESS);
  70.   (*
  71.    * Wie 'InstallPreExc', jedoch werden bei Auftreten der Exception
  72.    * zuerst die vorher installierten Handler und erst dann 'call'
  73.    * aufgerufen.
  74.    *)
  75.  
  76.  
  77. PROCEDURE DeInstallExc (VAR hdl: ADDRESS);
  78.   (*
  79.    * Entfernt alle unter 'hdl' installierte Exception-Handler.
  80.    *)
  81.  
  82.  
  83. PROCEDURE SysInstallPreExc (REF traps: ExcSet; call: ExcProc;
  84.              usermode: BOOLEAN; workSpace: MemArea; VAR hdl: ADDRESS);
  85.  
  86. PROCEDURE SysInstallPostExc (REF traps: ExcSet; call: ExcProc;
  87.              usermode: BOOLEAN; workSpace: MemArea; VAR hdl: ADDRESS);
  88.  
  89.  
  90. TYPE    HardExceptions = [2..255];
  91.  
  92. PROCEDURE RaiseExc (excNo: HardExceptions);
  93.   (*
  94.    * Simuliert die gewünschte Exception 'excNo' an der Stelle hinter
  95.    * dem Aufruf dieser Funktion.
  96.    *
  97.    * Darf sowohl im Usermode als auch im Supervisormode aufgerufen werden -
  98.    * allerdings nicht in Interruptroutinen, die im Usermode ablaufen.
  99.    *)
  100.  
  101. END Excepts.
  102.